package br.com.ericogr.hanoi.iu;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import br.com.ericogr.hanoi.Aplicativo;
import br.com.ericogr.hanoi.R;
import br.com.ericogr.hanoi.database.Pontuacao;

public class AtividadeConfiguracao extends Activity {
    public static final String QUANTIDADE_DE_PRATOS = "QUANTIDADE_DE_PRATOS";
    
    private static final int QUANTIDADE_MINIMA_DE_PRATOS = 3;
    private static final int QUANTIDADE_MAXIMA_DE_PRATOS = 8;
    private static final int QUANTIDADE_MAXIMA_DE_PRATOS_EXTRAS = 15;
    
    private int mQuantidadeDePratos = QUANTIDADE_MINIMA_DE_PRATOS;
    
    private SeekBar mSeekBarPratos;
    private TextView mTextViewPratos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.configuracao);
        inicializaComponentes();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        
        switch(item.getItemId()) {
        case R.id.menu_preferencias:
            startActivity(new Intent(this, AtividadePreferencias.class));
            break;
        case R.id.menu_item_recorde:
            startActivity(new Intent(this, AtividadeRecorde.class));
            break;
        case R.id.menu_sobre:
            exibirSobre();
            break;
        }
        
        
        return true;
    }

    private void exibirSobre() {
        String versao = null;
        
        try {
            versao = getPackageManager().getPackageInfo(getPackageName(), PackageInfo.CONTENTS_FILE_DESCRIPTOR).versionName;
            versao = getText(R.string.sobre_o_jogo) + " v" + versao; 
        }
        catch (PackageManager.NameNotFoundException ex) {
            Log.e(this.getClass().getName(), "Erro ao obter versao: " + ex.getMessage(), ex);
        }
        new AlertDialog.Builder(this)
            .setTitle(R.string.app_name)
            .setMessage(versao).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.configuracao, menu);
        return true;
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        
        gravarPratosSelecionados();
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        
        carregarPreferencias();
        atualizaPratos();
    }

    /**
     * Este método é chamado pelo layout
     * @param view
     */
    public void continuar(View view) {
        Intent intentJogo = new Intent(this, AtividadeMovePrato.class);
        
        intentJogo.putExtra(QUANTIDADE_DE_PRATOS, Integer.toString(mQuantidadeDePratos));
        
        startActivity(intentJogo);
    }
    
    private void inicializaComponentes() {
        mTextViewPratos = (TextView)findViewById(R.id.textViewPratos);
        mSeekBarPratos = (SeekBar)findViewById(R.id.seekBarPratos);
        mSeekBarPratos.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
            
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}
            
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                setPratos(QUANTIDADE_MINIMA_DE_PRATOS + progress);
            }
        });
        
        carregarPreferencias();
        atualizaPratos();
    }
    
    public void setPratos(int quantidade) {
        mQuantidadeDePratos = quantidade;
        atualizaPratos();
    }
    
    private void carregarPreferencias() {
        boolean pratosExtras = isPratosExtrasPermitidos();
        int quantidadeMaximaDePratos = (pratosExtras ? QUANTIDADE_MAXIMA_DE_PRATOS_EXTRAS - QUANTIDADE_MINIMA_DE_PRATOS : QUANTIDADE_MAXIMA_DE_PRATOS - QUANTIDADE_MINIMA_DE_PRATOS);
        
        mQuantidadeDePratos = getPratosSelecionados();
        mSeekBarPratos.setMax(quantidadeMaximaDePratos);
        mSeekBarPratos.setProgress(mQuantidadeDePratos - QUANTIDADE_MINIMA_DE_PRATOS);
        mSeekBarPratos.invalidate(); //necessário quando utilizando android 2.2
    }
    
    private void atualizaPratos() {
        Pontuacao p = new Pontuacao(mQuantidadeDePratos);
        String texto = Aplicativo.getTexto(R.string.texto_selecao_quantidade_de_pratos, new Object[] {mQuantidadeDePratos, p.calcularQuantidadeMinimaDeMovimentos()});
        
        mTextViewPratos.setText(texto);
    }
    
    private int getPratosSelecionados() {
        SharedPreferences pref = getPreferences(MODE_PRIVATE);
        int qtd = pref.getInt(QUANTIDADE_DE_PRATOS, 3);
        
        return qtd;
    }
    
    private boolean isPratosExtrasPermitidos() {
        SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        boolean extras = pref.getBoolean(getString(R.string.PERMITIR_PRATOS_EXTRAS), false);
        
        return extras;
    }
    
    private void gravarPratosSelecionados() {
        SharedPreferences pref = getPreferences(MODE_PRIVATE);
        Editor editor = pref.edit();
        
        editor.putInt(QUANTIDADE_DE_PRATOS, mQuantidadeDePratos);
        editor.commit();
    }
    
}